package blbetter.db.http;

import java.util.List;

import blbetter.db.BLDataBaseSQL;
import blbetter.db.Spiel;
import blbetter.netze.BlBetterInputSit;
import blbetter.netze.IBLBetterNet;

// liest die spiele eines spieltages von weltfussball.de aus
// und berechnet den EV
public class EVHttpReader {

	public IBLBetterNet blBetterNet;

	public BLDataBaseSQL db;

	// new double[][]{ new double[]{Under,Over}}
	public double[][] evs;
	public double[] ops;

	public List<Spiel> spiele;

	public double[] gewinnEv, gewinnOp, margen;

	public double einsatz = 10.;

	public EVHttpReader(IBLBetterNet blBetterNet, BLDataBaseSQL db) {
		this.blBetterNet = blBetterNet;
		this.db = db;
	}

	public void readEVs(int jahr1, int spieltag, double[][] quoten, double deltaU, double deltaO) {
		int saisonId = db.getSaisonIdByJahr1(jahr1);
		spiele = db.getSpieleBySaisonIdAndSpieltag(saisonId, spieltag);

		gewinnEv = new double[spiele.size()];
		gewinnOp = new double[spiele.size()];
		evs = new double[spiele.size()][2];
		ops = new double[spiele.size()];
		margen = new double[spiele.size()];
		for (int i = 0; i < spiele.size(); i++) {
			BlBetterInputSit is = blBetterNet.getInputSit(spiele.get(i), db);
			double op = blBetterNet.run(is.getInput());
			ops[i] = op;
			// if (op < (1. - delta) && op > delta)
			// continue;

			double quoteU = quoten[i][0];
			double quoteO = quoten[i][1];

			margen[i] = getGewinnMarge(quoteU, quoteO);

			// U
			evs[i][0] = (op * (quoteU - 1.)) - (1. - op);
			if (evs[i][0] > 0.) {
				gewinnEv[i] -= einsatz;
				if (spiele.get(i).heimTore + spiele.get(i).gastTore < 4) {
					gewinnEv[i] += einsatz * quoteU;
				}
			}
			if (evs[i][0] > deltaU) {
				gewinnOp[i] -= einsatz;
				if (spiele.get(i).heimTore + spiele.get(i).gastTore < 4) {
					gewinnOp[i] += einsatz * quoteU;
				}
			}
			// O
			evs[i][1] = ((1. - op) * (quoteO - 1.)) - op;
			if (evs[i][1] > 0.) {
				gewinnEv[i] -= einsatz;
				if (spiele.get(i).heimTore + spiele.get(i).gastTore > 3) {
					gewinnEv[i] += einsatz * quoteO;
				}
			}
			if (evs[i][1] > deltaO) {
				gewinnOp[i] -= einsatz;
				if (spiele.get(i).heimTore + spiele.get(i).gastTore > 3) {
					gewinnOp[i] += einsatz * quoteO;
				}
			}
		}
	}

	private double getGewinnMarge(double quoteU, double quoteO) {
		return 1. - (1. / (1. / quoteU + 1. / quoteO));
	}

}
